package com.udima.reglocation.util;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.app.Service;
import android.os.AsyncTask;

/**
 * 
 * Clase que maneja el envio de lllamadas http asíncronas
 * 
 * Recibe los parátemtros y la URL del envio y ejecuta la consulta de la cual redirige la respuesta
 * mediante un método callback a la clase que la invoca permitiendo realizar un manejo de respuestas.
 * 
 * @author luis
 *
 */

public class HttpAsyncTask extends AsyncTask<String, Integer, String> {

	// Variables para redirigir el callback al activity invocador
	private Activity activity;
	private ProgressDialog dialog;
	private AsyncTaskCompleteListener callback;

	private boolean showServerCommunicationMessage = true;

	public static final String CONNECTIONERROR = "CONNECTIONERROR";

	public HttpAsyncTask(Activity act) {
		this.activity = act;
		this.callback = (AsyncTaskCompleteListener) act;
	}

	public HttpAsyncTask(Service serv) {
		this.callback = (AsyncTaskCompleteListener) serv;
	}

	/**
	 * Activa o desactiva el mensaje en pantalla cuando se están consultando
	 * datos al servidor
	 * 
	 * @param b Booleano que marca la activación o desactivación del mensaje
	 */
	public void setShowServerCommunicationMessage(boolean b) {
		this.showServerCommunicationMessage = b;
	}

	/**
	 * Método de envio asíncrono que se ejecuta en background
	 * 
	 * @param params Cadena de caracteres en formato Json
	 * @return String Cadena de respuesta del servidor
	 */
	protected String doInBackground(String... params) {

		String respStr = "";
		HttpClient httpClient = new DefaultHttpClient();

		try {
			HttpPost post = new HttpPost(params[0]);
			post.setHeader("content-type", "application/json; charset=utf-8");
			post.setHeader("Content-Encoding", "UTF-8");

			// Pasamos el parámetro en la posición 1, es decir, el objeto json
			// de la clase que
			// se envía en formato string
			StringEntity entity = new StringEntity(params[1]);

			post.setEntity(entity);
			HttpResponse resp = httpClient.execute(post);
			respStr = EntityUtils.toString(resp.getEntity());

		} catch (Exception ex) {
			LogHelper.logError("Error conectando con el servidor", ex);
			respStr = CONNECTIONERROR;
		}

		return respStr;
	}

	@Override
	/**
	 * 
	 * Método que se ejecuta antes del proceso background de envio de parámetros
	 * 
	 */
	protected void onPreExecute() {

		super.onPreExecute();

		if (activity != null && showServerCommunicationMessage) {
			// Antes de la ejecución se muestra el mensaje de espera que estará
			// visible durante la consulta
			dialog = new ProgressDialog(activity);
			dialog.setMessage("Consultando...");
			dialog.show();
		}
	}

	@Override
	/**
	 * 
	 * Método que se ejecuta después del proceso background de envio de parámetros
	 * 
	 */
	protected void onPostExecute(String result) {

		super.onPostExecute(result);

		// Después de la ejecución, si hay mensaje de espera visible se elimina
		if (null != dialog && dialog.isShowing()) {
			dialog.dismiss();
		}

		// Llamada al método de callback con el resultado de la consulta
		callback.onTaskComplete(result);
	}
}